import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import Request from '@/utils/Request';
import { useNotificationStore } from './notification';
import { getToken } from '@/utils/Storage';

// 【!! V7 实时升级：导入 SignalR !!】
import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr';
const backendUrl = import.meta.env.VITE_APP_DEV;

export const useAlertStore = defineStore('healthAlerts', () => {
    // 1. State
    const alerts = ref([]);
    const isLoading = ref(false);
    const notificationStore = useNotificationStore();

    // 【!! V7 实时升级：SignalR 连接实例 !!】
    let connection = null;

    // 2. Getter
    const unreadAlerts = computed(() => {
        return alerts.value.filter(a => !a.isRead).length;
    });

// 3. Action: (Pull) 拉取历史数据
    async function fetchAlerts() {
        isLoading.value = true;
        try {
            const response = await Request.get('/health-alerts');
            alerts.value = response.data;
        } catch (error) {
            console.error("加载健康提醒失败 (fetchAlerts):", error);

            // 【!! 关键修复 !!】
            // 必须重新抛出错误，这样 init() 中的 try...catch 才能捕获到
            // 从而阻止 startSignalR() 在 fetch 失败后继续执行
            throw error;

        } finally {
            isLoading.value = false;
        }
    }

    // 4. Action: (Push) 启动并监听 SignalR
    async function startSignalR() {
        // 如果连接已存在，则不重复启动
        if (connection) return;

        const token = getToken(); // 从 Storage 中获取 JWT
        if (!token) {
            console.error('SignalR 启动失败：未找到 Token');
            return;
        }

        // 创建连接
        connection = new HubConnectionBuilder()
            // 【!! 关键 !!】
            // 1. 路径与 Program.cs (app.MapHub) 中一致
            // 2. 我们将 Token 作为 access_token 放入查询字符串
            //    这会与我们在 Program.cs (options.Events) 中的配置相匹配
            .withUrl(`${backendUrl}/hubs/health-alerts`, {
                accessTokenFactory: () => token
            })
            .configureLogging(LogLevel.Warning) // (可选) 设置日志级别
            .withAutomaticReconnect() // (推荐) 自动重连
            .build();

        // 【!! 关键 !!】
        // 监听来自服务器的 "ReceiveNewAlert" 事件
        // (这必须与 C# 后台服务 _hubContext.SendAsync("ReceiveNewAlert", ...) 中的名字一致)
        connection.on("ReceiveNewAlert", (newAlert) => {
            console.log("收到实时推送：", newAlert);

            // 1. 将新提醒添加到列表顶部
            alerts.value.unshift(newAlert);

            // 2. 弹出一个 Toast 通知
            notificationStore.info(`新提醒：${newAlert.title}`, 3000);
        });

        // 启动连接
        try {
            await connection.start();
            console.log("SignalR 已连接");
        } catch (err) {
            console.error("SignalR 连接失败:", err);
        }
    }

    // 5. Action: 标记已读 (保持不变, 但现在会实时同步)
    async function markAsRead(alertToRead) {
        if (alertToRead.isRead) return;
        try {
            const found = alerts.value.find(a => a.id === alertToRead.id);
            if (found) {
                found.isRead = true; // 乐观更新
            }
            await Request.put(`/health-alerts/${alertToRead.id}/read`);
        } catch (error) {
            console.error("标记已读失败:", error);
            const found = alerts.value.find(a => a.id === alertToRead.id);
            if (found) {
                found.isRead = false; // 回滚
            }
        }
    }

    // 6. Action: 标记全部已读 (保持不变)
    async function markAllAsRead() {
        // ... (代码与之前相同) ...
        try {
            alerts.value.forEach(a => a.isRead = true);
            await Request.post('/health-alerts/read-all');
        } catch (error) {
            console.error("全部已读失败:", error);
            fetchAlerts(); // 回滚
        }
    }

    // 7. init 函数
    async function init() {
        if (!getToken()) {
            console.warn("AlertStore: 用户未登录，跳过 init()。");
            return;
        }

        try {
            // 第 1 步：拉取历史消息
            // 【!! 行为改变 !!】
            // 如果 fetchAlerts 失败 (401)，它现在会抛出错误...
            await fetchAlerts();

            // 第 2 步：启动实时推送监听
            // 【!! 行为改变 !!】
            // ...这个 catch 块会捕获到错误，
            // 这一行 (startSignalR) 将永远不会被执行
            await startSignalR();

        } catch (error) {
            // (现在这里会捕获到 fetchAlerts 的 401 错误)
            console.error("AlertStore init() 过程中断:", error);
        }
    }
    return {
        alerts,
        isLoading,
        unreadAlerts,
        // (我们不再暴露 fetchAlerts 和 startSignalR, 只暴露 init)
        init,
        markAsRead,
        markAllAsRead
    };
});